#include "symbol.h"

/* 
 * Fonction qui ajoute un symbole au début de la liste chainée 
 */
symbol_table* add_symbol(symbol_table **table, char *identificateur, int type, int valeur) {
  symbol_table *new = (symbol_table *)malloc(sizeof(symbol_table));
  /*identificateur du symbole */ 
  new->nom = (char *) malloc (strlen(identificateur)+1);
  strcpy (new->nom,identificateur);
  /*type du symbole */
  new->type = type;
  /*valeur du symbole*/
  new->valeur = valeur;
  /*Ajout à la table*/
  new->suivant = (symbol_table *)*table;
  *table = new;
  return new;
}

/* 
 * Fonction qui ajoute un symbole temporaire au début de la liste chainée 
 */
symbol_table* add_temp_symbol(symbol_table **table, int type, int* temp_count, int valeur) {
  symbol_table *new = (symbol_table *)malloc(sizeof(symbol_table));
  /*identificateur du symbole */ 
  new->nom = (char *) malloc (sizeof(char)*(*temp_count));
  sprintf(new->nom,"temp_%d",*temp_count);
  /*type du symbole */
  new->type = type;
  /*valeur du symbole*/
  new->valeur = valeur;
  /*Ajout à la table*/
  new->suivant = (symbol_table *)*table;
  *table = new;
  *temp_count = *temp_count + 1;
  return new;
}

/* 
 * Fonction qui ajoute un symbole temporaire au début de la liste chainée 
 */
symbol_table* add_temp_string_symbol(symbol_table **table, int* temp_count,char* valeur) {
  symbol_table *new = (symbol_table *)malloc(sizeof(symbol_table));
  /*identificateur du symbole */ 
  new->nom = (char *) malloc (sizeof(char)*(*temp_count));
  sprintf(new->nom,"temp_%d",*temp_count);
  /*type du symbole */
  new->type = TYPE_STRING;
  /*valeur du symbole*/
  new->texte = malloc(sizeof(char)*strlen(valeur));
  strcpy(new->texte,valeur);
  /*Ajout à la table*/
  new->suivant = (symbol_table *)*table;
  *table = new;
  *temp_count = *temp_count + 1;
  return new;
}

/* 
 * Fonction qui ajoute un tableau au début de la liste chainée 
 */
symbol_table* add_array_symbol(symbol_table **table, char *identificateur, int type, dim_struct* dim) {
  symbol_table *new = (symbol_table *)malloc(sizeof(symbol_table));
  /*identificateur du symbole */ 
  new->nom = (char *) malloc (strlen(identificateur)+1);
  strcpy (new->nom,identificateur);
  /*type du symbole */
  new->type = type;
  /*valeurs du symbole*/
  new->valeur = get_size(dim);
  new->dim = dim;
  /*Ajout à la table*/
  new->suivant = (symbol_table *)*table;
  *table = new;
  return new;
}

/* 
 * Fonction qui renvoie le symbole présent à l'index en paramètre 
 */
symbol_table * get_symbol(symbol_table *table, char* identificateur) {
  symbol_table* courrant = table;
  while(courrant != NULL) {
    if(strcmp(courrant->nom,identificateur) == 0) return courrant;
    courrant = courrant->suivant;
  }
  return NULL;
}

/* 
 * Affiche la table des symboles
 */
void print_table(symbol_table *table) {
  symbol_table *identificateur = table;
  printf("    ident	|       constante   \n");
  printf("---------------------------------\n");
  while(identificateur != NULL) {
    printf("   %s	|          %d\n",identificateur->nom,identificateur->type);
    printf("---------------------------------\n");
    identificateur = identificateur->suivant;
  }
}
